R을 이용하면 아주 쉽게 자료를 변환할 수 있다.
자료의 변환의 일반적인 형태는 두 가지이다.
첫 형태는 다음과 같다.
새변수 <- 함수(기존변수)
여기서 function은 변수를 변환하는 데 사용할 함수이다. 둘째 형태는 다음과 같다.
새변수 <- 기존 변수(들)로 이루어진 산술 표현식
그럼 산술 표현식에 사용할 수 있는 산술 연산자들부터 살펴보자.
표 5.2는 가장 유용한 변환 함수들을 정리한 것이다.
이 표는 함수의 일반적인 형태와 의미뿐만 아니라 활용 예와 그 결과도 제시한다.
표에는 평균, 표준편차, 여들의 합을 계산하는 기본적인 함수들이 나와 있으며,
기운 분포의 자료를 변환하는 데 유용한 제곱근 함수와 로그 함수도 나와 있다.
제곱근과 로그는 다음 절들에서 실제로 사용해 볼 것이다.
결측자료의 개수를 세고 싶을 때는 is.na()를 사용하면 된다.
예를 들어 다음은 둘째 날의 위생 점수가 없는 사람들을 파악하는 명령이다.
dlf$missingDay2 <- is.na(dlf$day2)
이 변수를 교묘한 방식으로 활용할 수 있다.
예를 들어 둘째 날 위생 점수가 누락된 사람들의 수를 세려면 어떻게 해야 할까? 그런 사람은 이 변수의 값이1(TRUE)이므로, 다음처럼 1들을 모두 더하면 답이 나온다
sum(dlf$missingDay2)
결측 점수의 수만 알고 싶다면 굳이 새 변수를 만들 필요 없이 다음처럼 두 함수를 함께 사용하면 된다.
(sum(is.na(dlf$day2))
이 명령을 실행하면 546개의 점수가 빠졌다는 답이 나온다.
그 점수들의 비율은 어느 정도일까? is.na는 결측 점수에 대해서는 1. 그렇지 않은 점수에 대해서는 0에 해당하는 값을 돌려주므로, 그 값들의 평균이 곧 결측 점수들의 비율이다.
mean(is.na(dlf$day2))
이 명령은 평균이 0.674임을 말해준다.
따라서 둘째날 위생 점수가 없는 사람이 67.4%이다.
새 변수를 계산하는 기본적인 방법을 배웠으니, 그것을 이용해서 위생 점수 자료를 변환해 보자.
우선 변수 day1의 점수들을 변환해서 logday1이라는 새 변수를 만든다.
dlf$logday1 <- log(dlg$day1)
이 명령은 day1 변수의 값들의 자연로그 값들로 이루어진 logday1이라는 변수를 dlf데이터 프레임에 추가한다.
둘째 날 위생 점수들도 변환해 보자. 한 가지 문제는 둘째 날 위생 점수에는 0이 포함되어 있는대, 0의 자연로그 값은 존재하지 않는다는 것이다. 이 문제를 극복하려면 원래의 점수들에 상수를 더한 후에 로그를 취해야 한다. 점수가 0보다 커지기만 한다면 어떤 상수라도 좋다. 지금 예에서 자료집합의 최하 점수가 0이므로, 그냥 모든 점수에 상수1을 더하면 모든 점수가 0보다 커진다. 어떤 상수라도 좋다고 했지만 지금 예에서는 1이 되는데, 1의 자연로그는 0이기 때문에 원래의 자료에서 0점인 사람은 변환후에도 0점이 된다는 장점이 있기 때문이다. 다음은 이러한 변환을 수행하는 명령이다.
dlf$logday2 <- log(dlf$day2 + 1)
이 명령은 day2 변수의 값들에 1을 더한 결과의 자연로그 값들로 이루어진 logday2라는 변수를 dig데이터프레임에 추가한다
###5.8.3.3 R을 이용한 제급근 변환②
제곱근 변환도 마찬가지 방식으로 진행된다. 필요한 함수는 sqrt이다. 다음은 변수 day1의 값들의 제곱근을 담은 sqrtday1이라는 변수를 생성하는 예이다.
dlg$sqrtday1 <- sqrt(day1)
역수 변환은 함수대신 1/변수라는 산술 표현식을 사용한다. 그런대 둘째 날 자료에는 0이 포함되어 있으므로, 그 표현식을 그대로 사용하면 0으로 나누기에 관한 오류가 발생한다(0으로 나누는 것은 금지되어 있다). 따라서, 로그 변환에서처럼 먼저 해당 변수에 적당한상수를 더해 주어야 한다. 점수들이 0이 아닌 값이 되기만 한다면 어떤 상수라도 좋겠지만 지금 예에서는 1이 적당하다. 다음은 첫날 위생 점수들의 역수를 담은 recday1이라는 변수를 데이터 프레임에 추가하는 예이다.
dlg$recday1 <- 1/(dlg$day1 + 1)
ifelse() 함수는 주어진 조건에 따라서 두 가지 값 중 하나를 돌려주는 함수로, 조건에 따라 다른 값을 지정해서 새 변수를 만들거나 기존 변수를 변경할 때 사용할 수 있다. 일반적인 형태는 대음과 같다.
igelse(조건 인수, 조건 인수가 TRUE일 때의 값, 조건 인수가 FALSE일 때의 값)
이 함수는 세 개의 인수를 요구한다. 하나는 판정할 조건을 지정하는 인수이고, 또 하나는 그 조건이 참일 때의 값을 지정하는 인수, 그리고 마지막은 그 조건이 거짓일 때의 값을 지정하는 인수이다. 그럼 day1의 위생 점수에 이상치가 존재하는 원래의 자료에 대해 이 함수를 사용해 보자. 위생 점수는 4점 만점이므로, 4보다 큰 값이면 이상치에 해당한다. 따라서, 첫째 날 위생 점수들에서 이상치를 검출하여 조건은 dif$day1 > 4이다. 이 조건은 “만일 day1의 값이 4보다 크면” 이라고 해석할 수 있다. 이 조건이 참이면 해당 점수를 결측값(NA)으로 설정하고, 그렇지 않으면 점수를 그대로 유지한다고 하자. 다음은 이에 해당하는 명령이다.
dlf$day1noOutlier <- ifelse(dlf$day1 > 4, NA, dlf$day1)
이 명령은 day1NoOutlier라는 새 변수를 생성하는데, 이 새 변수의 값은 만일 day1의 값이 4보다 크면 NA이고 4보다 작거나 같으면 day1의 값 그대로이다.
변수에 결측자료가 존재한다면, rowMeans() 같은 함수를 하용할 때 조심하지 않으면 원하는 답을 얻지 못한다. 이때 관건은 결측자료를 취급하는 방식을 제대로 결정하는 것이다. 이런 문제를 생각해 보자. 나에게 오렌지 두 개와 사과 세 개가 있다. 내가 가진 과일은 총 몇 개일까? 다아연히 다섯 개이다. 개수는 결측값이다. 이때 여러분의 과일은 몇 개인가? 두 개라고 말할 수도 있고, 알 수 없다고 말할수도 있다. 만일 R에서 사과 개수와 오렌지 개수를 더하면, 대부분의 함수는 NA(알 수 없음)라는 답을 낸다
apples <- 2
oranges <- NA
apples + oranges
[1] NA
다행히 rowSums 함수와 rowMeans 함수에서는 결측자료가 처리하는 방식은 ra.rm 옵션을 통해서 지정할 수 있다. 이 옵션에서 na는 결측값을, rm은 제거 (remove)를 뜻한다.
3일간 평균 위생 점수를 다음 명령으로 계산한다고 하자.
dlf$meanHygiene <- rowMeans(dlf$day1, dlf$day2, dlf$day3), na,rm = TRUE
그런데 위생 점수를 3일이 아니라 100일간 매일 측정했다면 어떨까? 그리고 점수가 한두 개 빠진 정도면 평균을 계산하되 점수가 아예 없거나 하나밖에 없는 사람들은 평균을 계산하지 않으려면 어떻게 해야 할까? 이런 경우에는 다음 처럼 is.na() 함수를 이용해서 결측값들의 개수를 세어두는 것이 좋다.
dlf$daysMissing <- rowSums (cbind (is.na(dlf$day1),
is.na(dlf$day2),
is.na(dlf$day3)))
(하나의 명령을 이처럼 여러 줄로 나누어 입력해도 된다. 이렇게 하면 코드를 읽기 쉬워져서 실수를 저리를 여지가 줄어들기도 한다.) 그런 다음에는 다음처럼 ifelse() 함수를 이용해서 위생 점수를 적어도 두 개인(즉. 결측값이 최대 하나인) 사람들만 평균을 계산할 수 있다.
dlf$meanHygiene <- ifelse(dlf$daysMissing < 2, NA,
rowMeans(cbind( dlf$day1,
dlf$day2,
dlf$day3),
na.rm=TRUE))
인수들이 어떤 함수에 속하는지 명확히 나타내기 우해 적절히 줄을 바꾸고 들여 썼음을 주목하기 바란다. 이렇게 하면 실수를 범할 여지가 줄어든다.
그림 5.9는 페스티벌 첫날과 둘째 날의 서로 다른 세 가지 변환을 적용한 후의 분포를 나타낸 것이다. 이들을 그림 5.2에 나온, 변환되지 않는 분포들과 비교해 보자. 둘째 날의 분포를 보면, 면환 후에는 분포가 양으로 기운 정도가 줄어들었음을 알 수 있다. 그러나 첫날의 분포는 사정이 다르다. 이 자료는 원래부터 어느 정도 대칭적이기 때문에, 로그 변환과 제곱근 변환 후에는 분포가 조금 음으로 기울었고 역수 변환 후에는 양으로 기울었다! 만일 둘째 날 점수들의 변환이 주는 이득이 첫째 날 점수들의 변환에서 생기는 문제점보다 클 것인지 판단해야 한다. 이처럼, 종종 자료의 분석은 까다로운 결정을 요구한다.
자료의 변환이 모든 가정 위반에 대한 궁극의 해답인 것처럼 느껴지겠지만, 자료 변환이 항상 바람직하지는 않은 이유들이 존재한다. 특히, 자료 변환이 실제로는 문제를 해결해 주지 못하거나, 문제를 해결하긴 하지만 그 과정에서 다른 문제를 유발하기도 한다. 이런 일은 여러분이 상상하는 것보다 훨씬 자주 발생한다. 어쩔 수 없을 정도로 엉망인 자료를 다루어야 하는 난감한 상황에 빠졌을 때 시도해 볼 만한 방법이 몇 가지 있다,
-첫 번째는 자료가 정규분포라는 가정을 두지 않는 검정을 사용하는 것이다.